package bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlInputText;

import mensagem.MsgCondicao;
import session.SessionCondPagamento;
import session.SessionFormaPagamento;
import session.SessionParcela;
import entity.CondPagamento;
import entity.FormaPagamento;
import entity.Parcela;

@ManagedBean
@SessionScoped
public class BeanCondicao {

	private CondPagamento condicao = new CondPagamento();

	private CondPagamento filtro = new CondPagamento();

	private List<CondPagamento> condicoes = new ArrayList<CondPagamento>();

	private SessionCondPagamento session = new SessionCondPagamento();

	private Parcela parcela = new Parcela();

	private SessionParcela sessionP = new SessionParcela();

	private List<Parcela> parcelas = new ArrayList<Parcela>();

	private SessionFormaPagamento sessionF = new SessionFormaPagamento();

	private HtmlInputText formaPagamento;

	private Integer dias;

	private Integer numeroParcelas = new Integer(1);

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public BeanCondicao() {

	}

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public CondPagamento getCondicao() {
		return condicao;
	}

	public void setCondicao(CondPagamento condicao) {
		this.condicao = condicao;
	}

	public CondPagamento getFiltro() {
		return filtro;
	}

	public void setFiltro(CondPagamento filtro) {
		this.filtro = filtro;
	}

	public List<CondPagamento> getCondicoes() {
		return condicoes;
	}

	public void setCondicoes(List<CondPagamento> condicoes) {
		this.condicoes = condicoes;
	}

	public SessionCondPagamento getSession() {
		return session;
	}

	public void setSession(SessionCondPagamento session) {
		this.session = session;
	}

	public Parcela getParcela() {
		return parcela;
	}

	public void setParcela(Parcela parcela) {
		this.parcela = parcela;
	}

	public SessionParcela getSessionP() {
		return sessionP;
	}

	public void setSessionP(SessionParcela sessionP) {
		this.sessionP = sessionP;
	}

	public List<Parcela> getParcelas() {
		return parcelas;
	}

	public void setParcelas(List<Parcela> parcelas) {
		this.parcelas = parcelas;
	}

	public SessionFormaPagamento getSessionF() {
		return sessionF;
	}

	public void setSessionF(SessionFormaPagamento sessionF) {
		this.sessionF = sessionF;
	}

	public HtmlInputText getFormaPagamento() {
		return formaPagamento;
	}

	public void setFormaPagamento(HtmlInputText formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	public Integer getDias() {
		return dias;
	}

	public void setDias(Integer dias) {
		this.dias = dias;
	}

	public Integer getNumeroParcelas() {
		return numeroParcelas;
	}

	public void setNumeroParcelas(Integer numeroParcelas) {
		this.numeroParcelas = numeroParcelas;
	}

	// ///////////////////////////////METODOS/////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public void reinit() {
		this.condicao = new CondPagamento();
		this.condicoes = new ArrayList<CondPagamento>();
		this.dias = null;
		this.filtro = new CondPagamento();
		this.formaPagamento.setValue("");
		this.numeroParcelas = new Integer(1);
		this.parcela = new Parcela();
		this.parcelas = new ArrayList<Parcela>();
	}

	private void reinitParcial() {
		this.dias = null;
		this.parcela = new Parcela();
	}

	public String save() throws Exception {
		if (condicao.getId() != null) {
			this.update();
			return null;
		}

		this.condicao.setNumero(parcelas.size());
		if (this.session.save(this.condicao)) {
			for (int i = 0; i < parcelas.size(); i++) {
				this.parcelas.get(i).setCondPagamento(this.condicao);
				this.sessionP.save(parcelas.get(i));
			}
			this.reinit();
			return MsgCondicao.msgSave();
		}
		return null;
	}

	private String update() throws Exception {
		this.condicao.setNumero(parcelas.size());
		if (this.session.update(this.condicao)) {
			for (int i = 0; i < parcelas.size(); i++) {
				this.parcelas.get(i).setCondPagamento(this.condicao);
				this.sessionP.update(parcelas.get(i));
			}
			this.reinit();
			return MsgCondicao.msgUpdate();
		}
		return MsgCondicao.msgUpdate();
	}

	private String remove() {
		try {
			this.session.remove(this.condicao);
			return MsgCondicao.msgRemove();
		} catch (Exception e) {
			return MsgCondicao.msgNotRemove();
		}
	}

	private boolean validaParcela() {
		// TODO Auto-generated method stub
		return true;
	}

	public void addParcela() {
		if (this.validaParcela()) {
			this.parcela.setNumero(this.getNumeroParcelas());
			this.setNumeroParcelas(this.getNumeroParcelas() + 1);

			this.parcelas.add(parcela);
			this.reinitParcial();
		}

	}

	public void removeParcela() {
		this.setNumeroParcelas(this.getNumeroParcelas() - 1);
		this.parcelas.remove(parcela);
		this.reinitParcial();
		this.renumeraParcela();
	}

	private void renumeraParcela() {
		for (int i = 0; i < this.parcelas.size(); i++) {
			this.parcelas.get(i).setNumero(i + 1);
		}

	}

	public void find() throws Exception {
		this.condicoes = this.session.findList(this.filtro);
	}

	public String hotFindForma() throws Exception {
		if (this.condicao.getFormaPagamento() != null) {
			if ((this.condicao.getFormaPagamento().getId() != null)
					&& (this.condicao.getFormaPagamento().getDescricao() != null)) {
				int aux = this.condicao.getFormaPagamento().getId();
				this.condicao.setFormaPagamento(new FormaPagamento());
				this.condicao.getFormaPagamento().setId(aux);
			}
		}

		if ((this.condicao.getFormaPagamento() != null)
				&& (this.condicao.getFormaPagamento().getId() != null)) {
			try {
				this.condicao.setFormaPagamento(this.sessionF.getController()
						.find(this.condicao.getFormaPagamento()));
			} catch (Exception e) {
				this.condicao.setFormaPagamento(new FormaPagamento());
			}
			if ((this.condicao.getFormaPagamento() != null)
					&& (condicao.getFormaPagamento().getDescricao() != null)) {
				this.formaPagamento.setValue(condicao.getFormaPagamento()
						.getDescricao());
				return null;
			}
		}
		this.condicao.setFormaPagamento(new FormaPagamento());
		return null;
	}

}
